package com.grupobbva.seguridad.client.filter;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.grupobbva.seguridad.client.domain.Usuario;
import com.grupobbva.seguridad.client.domain.UsuarioAplicacion;
import com.grupobbva.seguridad.client.service.SeguridadService;
import com.grupobbva.seguridad.client.service.ServiciosSeguridadBbva;
import com.grupobbva.seguridad.client.util.Constante;
import com.grupobbva.seguridad.client.util.UtilDesarrollo;
//import com.grupobbva.bc.per.tele.seguridad.ServiciosSeguridadBbva;

public class ValidacionSessionFilter implements Filter {
	
	public FilterConfig config; 
	protected boolean modoDesarrollo;

    public ValidacionSessionFilter() {
        
    }

	public void init(FilterConfig fConfig) throws ServletException {
		this.config = fConfig;
		String modo = config.getInitParameter(Constante.PARA_MODO_DESARROLLO);
		String jndi = config.getInitParameter(Constante.PARA_JNDI_SEGURIDAD);
		modoDesarrollo = (modo != null && modo.trim().toUpperCase().equals("TRUE"));
		//Constante.JNDI_SEGURIDAD = (jndi==null || jndi.trim().equals(""))?Constante.JNDI_SEGURIDAD:jndi;   //comentado: 17/09/12		

		//agregado 17/09/12  
		String wsdl = config.getInitParameter(Constante.PARA_WSDL_SEGURIDAD);
		Constante.JNDI_SEGURIDAD = jndi;
		Constante.WSDL_SEGURIDAD = wsdl;
	}

	public void destroy() {
		
	}
	
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		HttpSession sesion = ((HttpServletRequest)request).getSession();
		String mensaje = "";
		try {
			if(sesion.getAttribute(Constante.SESSION_USUARIO) == null) {
				String contexto  = (((HttpServletRequest) request).getRequestURI()).split("/")[1];
				String usuarioId = null;
				Usuario usuario  = null;
				List<UsuarioAplicacion> usuariosAplicacion = null;
				
				//SI SE ESTA EN MODO PRODUCCION
				if (modoDesarrollo == false) {
					try {
						ServiciosSeguridadBbva servicios = new ServiciosSeguridadBbva((HttpServletRequest) request);
						servicios.obtener_ID();
						usuarioId = servicios.getUsuario().toUpperCase();
					} catch (Exception e) {
						e.printStackTrace();
					}
					
					if(usuarioId == null || usuarioId.equals("")) {
						usuarioId = request.getParameter(Constante.REQUEST_USUARIO_ID);
					}
					
					usuario = SeguridadService.validarUsuario(contexto, usuarioId);
					usuariosAplicacion = SeguridadService.validarUsuariosAplicacion(contexto, usuarioId);
				//SI SE ESTA EN MODO DESARROLLO
				} else {
					/*
					usuario = new Usuario();
					usuario.setUsuarioId("P000001");
					usuario.setNombres("Usuario de Prueba");
					usuario.setAplicacion(new Aplicacion(1,"Aplicacion de Prueba"));
					usuario.setPerfil(new Perfil((long)1,"Perfil de Prueba"));
					usuario.setOficina(new Oficina("0001", "Oficina de Prueba"));
					usuario.setPuesto(new Puesto("001", "Puesto de Prueba"));
					usuario.setOpciones(new HashMap());
					*/
					usuario = UtilDesarrollo.generarDatosUsuario();
				}
				sesion.setAttribute(Constante.SESSION_USUARIO, usuario);
				sesion.setAttribute(Constante.USUARIOS_APLICACION, usuariosAplicacion);
				
				ejecutarLoginExito((HttpServletRequest) request, (HttpServletResponse) response);
			}
		} catch(Exception e) {
			mensaje = e.getMessage();
			e.printStackTrace();
			
			ejecutarLoginError((HttpServletRequest) request, (HttpServletResponse) response);
		}
		if(sesion.getAttribute(Constante.SESSION_USUARIO) == null) {
			response.setContentType("text/html");
			PrintWriter out = response.getWriter();
			out.write("<center>La validacion del usuario no fue satisfactoria por el siguiente motivo: "+mensaje+"</center>");
			out.close();
		}
		chain.doFilter(request, response);
	}
	
	protected void ejecutarLoginExito(HttpServletRequest request, HttpServletResponse response) {
		
	}
	
	protected void ejecutarLoginError(HttpServletRequest request, HttpServletResponse response) {
		
	}
	
	public static void main(String[] args) {
		System.out.println("/seguridad/apllst.do".split("/")[1]);
		System.out.println("/".split("/")[1]);
	}
}
